#include <jni.h>
#include <string>
#include <android/log.h>
#include "calculate.h"

// 实际的 native 实现函数
extern "C"
jdouble calculateNative(JNIEnv *env, jobject /* this */, jdouble a, jdouble b, jchar op) {
    __android_log_print(ANDROID_LOG_INFO, "calculateNative", "a=%lf,b=%lf,op=%c", a, b, op);
    return calculate(a, b, op);
//    switch (op) {
//        case '+': return a + b;
//        case '-': return a - b;
//        case '*': return a * b;
//        case '/':
//            if (b != 0)
//                return a / b;
//            else
//                return 0.0 / 0.0; // NaN
//        default:
//            return 0.0 / 0.0; // NaN
//    }
}

// 定义 native 方法表
static const JNINativeMethod gMethods[] = {
        {
                "calculate",                      // Java 方法名
                "(DDC)D",                         // 签名：两个 double、一个 char 返回 double
                (void *) calculateNative         // 对应的 C++ 函数指针
        }
};

// 查找并注册 native 方法到指定类
static int registerNativeMethods(JNIEnv* env, const char* className,
                                 const JNINativeMethod* gMethods, int numMethods) {
    jclass clazz = env->FindClass(className);
    if (clazz == nullptr) {
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
        return JNI_FALSE;
    }
    return JNI_TRUE;
}

// 入口函数，用于动态注册 native 方法
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env = nullptr;
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    // 注册 native 方法
    if (!registerNativeMethods(env, "com/example/androidapptest/ollvm/OllvmTest",
                               gMethods, sizeof(gMethods) / sizeof(gMethods[0]))) {
        return -1;
    }

    calculate(10, 20, '*');

    return JNI_VERSION_1_6;
}